import { _decorator, Node } from 'cc'
import { DIRECTION_ENUM, ENTITY_STATE_ENUM, ENTITY_TYPE_ENUM, EVENT_NAME_ENUM } from '../enums'
import { EntityMgr } from '../base/EntityMgr'
import EventMgr from '../runtime/EventMgr'
import DataMgr from '../runtime/DataMgr'
import { IronSkeletonStateMachine } from './IronSkeletonStateMachine'
import { IEntity } from '../levels'
const { ccclass, property } = _decorator
/** 铁骷髅管理器 实际创建铁骷髅的逻辑 */
// 紧记 地图是以左上角为原点，向下y轴是负数，往左x轴是正数的坐标图
@ccclass('IronSkeletonMgr')
export class IronSkeletonMgr extends EntityMgr {
  async init(initData: IEntity) {
    // 添加状态机
    this.fsm = this.addComponent(IronSkeletonStateMachine)
    await this.fsm.init() // 初始化状态机参数

    // 使用父类的init方法
    super.init(initData)

    EventMgr.Instance.on(EVENT_NAME_ENUM.PLAYER_MOVE_END, this.handleEnemyDirector, this) // 监听玩家移动结束事件
    EventMgr.Instance.on(EVENT_NAME_ENUM.PLAYER_BORN, this.handleEnemyDirector, this) // 监听玩家初始化完成事件
    EventMgr.Instance.on(EVENT_NAME_ENUM.ATTACK_ENEMY, this.handleAttackEnemy, this) // 监听敌人被攻击的事件
    this.handleEnemyDirector() // 作用：如果是玩家先生成，那么初始化的时候敌人也会朝向玩家
  }

  // 让敌人的朝向会跟随玩家位置移动而改变
  handleEnemyDirector() {
    // 敌人死了或者玩家不存在
    if (this.state === ENTITY_STATE_ENUM.DEATH || !DataMgr.Instance.player) return
    // 获取玩家当前的坐标
    const { x: playerX, y: playerY } = DataMgr.Instance.player

    const disX = Math.abs(playerX - this.x) // 对比玩家坐标和木乃伊坐标的横向距离
    const disY = Math.abs(-playerY - -this.y) // 对比玩家坐标和木乃伊坐标的纵向距离

    // 根据坐标系判断玩家在木骷髅的点位
    if (playerX <= this.x && playerY <= this.y) {
      // 玩家在木骷髅左下位置
      this.direction = disX < disY ? DIRECTION_ENUM.BOTTOM : DIRECTION_ENUM.LEFT
    } else if (playerX <= this.x && playerY >= this.y) {
      // 玩家在木骷髅左上位置
      this.direction = disX < disY ? DIRECTION_ENUM.TOP : DIRECTION_ENUM.LEFT
    } else if (playerX >= this.x && playerY <= this.y) {
      // 玩家在木骷髅右下位置
      this.direction = disX < disY ? DIRECTION_ENUM.BOTTOM : DIRECTION_ENUM.RIGHT
    } else if (playerX >= this.x && playerY >= this.y) {
      // 玩家在木骷髅右上位置
      this.direction = disX < disY ? DIRECTION_ENUM.TOP : DIRECTION_ENUM.RIGHT
    }
  }

  // 敌人被玩家攻击
  handleAttackEnemy(attackEnemyId: string) {
    if (this.state === ENTITY_STATE_ENUM.DEATH) return // 死亡后不能再次被攻击

    if (this.id === attackEnemyId) {
      this.state = ENTITY_STATE_ENUM.DEATH
    }
  }

  onDestroy(): void {
    EventMgr.Instance.off(EVENT_NAME_ENUM.PLAYER_MOVE_END, this.handleEnemyDirector)
    EventMgr.Instance.off(EVENT_NAME_ENUM.PLAYER_BORN, this.handleEnemyDirector)
    EventMgr.Instance.off(EVENT_NAME_ENUM.ATTACK_ENEMY, this.handleAttackEnemy)
  }
}
